home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / gfx / x11 / twm_930531.lha / twm / gram.y < prev    next >
Text File  |  1993-05-29  |  21KB  |  855 lines

  1. /*****************************************************************************/
  2. /**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
  3. /**                          Salt Lake City, Utah                           **/
  4. /**  Portions Copyright 1989 by the Massachusetts Institute of Technology   **/
  5. /**                        Cambridge, Massachusetts                         **/
  6. /**                                                                         **/
  7. /**                           All Rights Reserved                           **/
  8. /**                                                                         **/
  9. /**    Permission to use, copy, modify, and distribute this software and    **/
  10. /**    its documentation  for  any  purpose  and  without  fee is hereby    **/
  11. /**    granted, provided that the above copyright notice appear  in  all    **/
  12. /**    copies and that both  that  copyright  notice  and  this  permis-    **/
  13. /**    sion  notice appear in supporting  documentation,  and  that  the    **/
  14. /**    names of Evans & Sutherland and M.I.T. not be used in advertising    **/
  15. /**    in publicity pertaining to distribution of the  software  without    **/
  16. /**    specific, written prior permission.                                  **/
  17. /**                                                                         **/
  18. /**    EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD    **/
  19. /**    TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES  OF  MERCHANT-    **/
  20. /**    ABILITY  AND  FITNESS,  IN  NO  EVENT SHALL EVANS & SUTHERLAND OR    **/
  21. /**    M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL  DAM-    **/
  22. /**    AGES OR  ANY DAMAGES WHATSOEVER  RESULTING FROM LOSS OF USE, DATA    **/
  23. /**    OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER    **/
  24. /**    TORTIOUS ACTION, ARISING OUT OF OR IN  CONNECTION  WITH  THE  USE    **/
  25. /**    OR PERFORMANCE OF THIS SOFTWARE.                                     **/
  26. /*****************************************************************************/
  27.  
  28.  
  29. /***********************************************************************
  30.  *
  31.  * $XConsortium: gram.y,v 1.91 91/02/08 18:21:56 dave Exp $
  32.  *
  33.  * .twmrc command grammer
  34.  *
  35.  * 07-Jan-86 Thomas E. LaStrange    File created
  36.  * 11-Nov-90 Dave Sternlicht            Adding SaveColors
  37.  * 10-Oct-90 David M. Sternlicht        Storing saved colors on root
  38.  *
  39.  ***********************************************************************/
  40.  
  41. %{
  42. #include <stdio.h>
  43. #include <ctype.h>
  44. #include "twm.h"
  45. #include "menus.h"
  46. #include "list.h"
  47. #include "util.h"
  48. #include "screen.h"
  49. #include "parse.h"
  50. #include <X11/Xos.h>
  51. #include <X11/Xmu/CharSet.h>
  52.  
  53. static char *Action = "";
  54. static char *Name = "";
  55. static MenuRoot    *root, *pull = NULL;
  56.  
  57. static MenuRoot *GetRoot();
  58.  
  59. static Bool CheckWarpScreenArg(), CheckWarpRingArg();
  60. static Bool CheckColormapArg();
  61. static void GotButton(), GotKey(), GotTitleButton();
  62. static char *ptr;
  63. static name_list **list;
  64. static int cont = 0;
  65. static int color;
  66. int mods = 0;
  67. unsigned int mods_used = (ShiftMask | ControlMask | Mod1Mask);
  68.  
  69. extern int do_single_keyword(), do_string_keyword(), do_number_keyword();
  70. extern name_list **do_colorlist_keyword();
  71. extern int do_color_keyword(), do_string_savecolor();
  72. int yylineno;
  73. %}
  74.  
  75. %union
  76. {
  77.     int num;
  78.     char *ptr;
  79. };
  80.  
  81. %token <num> LB RB LP RP MENUS MENU BUTTON DEFAULT_FUNCTION PLUS MINUS
  82. %token <num> ALL OR CURSORS PIXMAPS ICONS COLOR SAVECOLOR MONOCHROME FUNCTION 
  83. %token <num> ICONMGR_SHOW ICONMGR WINDOW_FUNCTION ZOOM ICONMGRS
  84. %token <num> ICONMGR_GEOMETRY ICONMGR_NOSHOW MAKE_TITLE
  85. %token <num> ICONIFY_BY_UNMAPPING DONT_ICONIFY_BY_UNMAPPING 
  86. %token <num> NO_TITLE AUTO_RAISE NO_HILITE ICON_REGION 
  87. %token <num> META SHIFT LOCK CONTROL WINDOW TITLE ICON ROOT FRAME 
  88. %token <num> COLON EQUALS SQUEEZE_TITLE DONT_SQUEEZE_TITLE
  89. %token <num> START_ICONIFIED NO_TITLE_HILITE TITLE_HILITE
  90. %token <num> MOVE RESIZE WAIT SELECT KILL LEFT_TITLEBUTTON RIGHT_TITLEBUTTON 
  91. %token <num> NUMBER KEYWORD NKEYWORD CKEYWORD CLKEYWORD FKEYWORD FSKEYWORD 
  92. %token <num> SKEYWORD DKEYWORD JKEYWORD WINDOW_RING WARP_CURSOR ERRORTOKEN
  93. %token <num> NO_STACKMODE
  94. %token <ptr> STRING 
  95.  
  96. %type <ptr> string
  97. %type <num> action button number signed_number full fullkey
  98.  
  99. %start twmrc 
  100.  
  101. %%
  102. twmrc        : stmts
  103.         ;
  104.  
  105. stmts        : /* Empty */
  106.         | stmts stmt
  107.         ;
  108.  
  109. stmt        : error
  110.         | noarg
  111.         | sarg
  112.         | narg
  113.         | squeeze
  114.         | ICON_REGION string DKEYWORD DKEYWORD number number
  115.                     { AddIconRegion($2, $3, $4, $5, $6); }
  116.         | ICONMGR_GEOMETRY string number    { if (Scr->FirstTime)
  117.                           {
  118.                             Scr->iconmgr.geometry=$2;
  119.                             Scr->iconmgr.columns=$3;
  120.                           }
  121.                         }
  122.         | ICONMGR_GEOMETRY string    { if (Scr->FirstTime)
  123.                             Scr->iconmgr.geometry = $2;
  124.                         }
  125.         | ZOOM number        { if (Scr->FirstTime)
  126.                       {
  127.                         Scr->DoZoom = TRUE;
  128.                         Scr->ZoomCount = $2;
  129.                       }
  130.                     }
  131.         | ZOOM            { if (Scr->FirstTime) 
  132.                         Scr->DoZoom = TRUE; }
  133.         | PIXMAPS pixmap_list    {}
  134.         | CURSORS cursor_list    {}
  135.         | ICONIFY_BY_UNMAPPING    { list = &Scr->IconifyByUn; }
  136.           win_list
  137.         | ICONIFY_BY_UNMAPPING    { if (Scr->FirstTime) 
  138.             Scr->IconifyByUnmapping = TRUE; }
  139.         | LEFT_TITLEBUTTON string EQUALS action { 
  140.                       GotTitleButton ($2, $4, False);
  141.                     }
  142.         | RIGHT_TITLEBUTTON string EQUALS action { 
  143.                       GotTitleButton ($2, $4, True);
  144.                     }
  145.         | button string        { root = GetRoot($2, NULLSTR, NULLSTR);
  146.                       Scr->Mouse[$1][C_ROOT][0].func = F_MENU;
  147.                       Scr->Mouse[$1][C_ROOT][0].menu = root;
  148.                     }
  149.         | button action        { Scr->Mouse[$1][C_ROOT][0].func = $2;
  150.                       if ($2 == F_MENU)
  151.                       {
  152.                         pull->prev = NULL;
  153.                         Scr->Mouse[$1][C_ROOT][0].menu = pull;
  154.                       }
  155.                       else
  156.                       {
  157.                         root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
  158.                         Scr->Mouse[$1][C_ROOT][0].item = 
  159.                         AddToMenu(root,"x",Action,
  160.                               NULLSTR,$2,NULLSTR,NULLSTR);
  161.                       }
  162.                       Action = "";
  163.                       pull = NULL;
  164.                     }
  165.         | string fullkey    { GotKey($1, $2); }
  166.         | button full        { GotButton($1, $2); }
  167.         | DONT_ICONIFY_BY_UNMAPPING { list = &Scr->DontIconify; }
  168.           win_list
  169.         | ICONMGR_NOSHOW    { list = &Scr->IconMgrNoShow; }
  170.           win_list
  171.         | ICONMGR_NOSHOW    { Scr->IconManagerDontShow = TRUE; }
  172.         | ICONMGRS        { list = &Scr->IconMgrs; }
  173.           iconm_list
  174.         | ICONMGR_SHOW        { list = &Scr->IconMgrShow; }
  175.           win_list
  176.         | NO_TITLE_HILITE    { list = &Scr->NoTitleHighlight; }
  177.           win_list
  178.         | NO_TITLE_HILITE    { if (Scr->FirstTime)
  179.                         Scr->TitleHighlight = FALSE; }
  180.         | NO_HILITE        { list = &Scr->NoHighlight; }
  181.           win_list
  182.         | NO_HILITE        { if (Scr->FirstTime)
  183.                         Scr->Highlight = FALSE; }
  184.         | NO_STACKMODE        { list = &Scr->NoStackModeL; }
  185.           win_list
  186.         | NO_STACKMODE        { if (Scr->FirstTime)
  187.                         Scr->StackMode = FALSE; }
  188.         | NO_TITLE        { list = &Scr->NoTitle; }
  189.           win_list
  190.         | NO_TITLE        { if (Scr->FirstTime)
  191.                         Scr->NoTitlebar = TRUE; }
  192.         | MAKE_TITLE        { list = &Scr->MakeTitle; }
  193.           win_list
  194.         | START_ICONIFIED    { list = &Scr->StartIconified; }
  195.           win_list
  196.         | AUTO_RAISE        { list = &Scr->AutoRaise; }
  197.           win_list
  198.         | MENU string LP string COLON string RP    {
  199.                     root = GetRoot($2, $4, $6); }
  200.           menu            { root->real_menu = TRUE;}
  201.         | MENU string         { root = GetRoot($2, NULLSTR, NULLSTR); }
  202.           menu            { root->real_menu = TRUE; }
  203.         | FUNCTION string    { root = GetRoot($2, NULLSTR, NULLSTR); }
  204.           function
  205.         | ICONS         { list = &Scr->IconNames; }
  206.           icon_list
  207.         | COLOR         { color = COLOR; }
  208.           color_list
  209.                 | SAVECOLOR          
  210.                   save_color_list
  211.                 | MONOCHROME         { color = MONOCHROME; }
  212.               color_list
  213.         | DEFAULT_FUNCTION action { Scr->DefaultFunction.func = $2;
  214.                       if ($2 == F_MENU)
  215.                       {
  216.                         pull->prev = NULL;
  217.                         Scr->DefaultFunction.menu = pull;
  218.                       }
  219.                       else
  220.                       {
  221.                         root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
  222.                         Scr->DefaultFunction.item = 
  223.                         AddToMenu(root,"x",Action,
  224.                               NULLSTR,$2, NULLSTR, NULLSTR);
  225.                       }
  226.                       Action = "";
  227.                       pull = NULL;
  228.                     }
  229.         | WINDOW_FUNCTION action { Scr->WindowFunction.func = $2;
  230.                        root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
  231.                        Scr->WindowFunction.item = 
  232.                         AddToMenu(root,"x",Action,
  233.                               NULLSTR,$2, NULLSTR, NULLSTR);
  234.                        Action = "";
  235.                        pull = NULL;
  236.                     }
  237.         | WARP_CURSOR        { list = &Scr->WarpCursorL; }
  238.           win_list
  239.         | WARP_CURSOR        { if (Scr->FirstTime) 
  240.                         Scr->WarpCursor = TRUE; }
  241.         | WINDOW_RING        { list = &Scr->WindowRingL; }
  242.           win_list
  243.         ;
  244.  
  245.  
  246. noarg        : KEYWORD        { if (!do_single_keyword ($1)) {
  247.                         twmrc_error_prefix();
  248.                         fprintf (stderr,
  249.                     "unknown singleton keyword %d\n",
  250.                              $1);
  251.                         ParseError = 1;
  252.                       }
  253.                     }
  254.         ;
  255.  
  256. sarg        : SKEYWORD string    { if (!do_string_keyword ($1, $2)) {
  257.                         twmrc_error_prefix();
  258.                         fprintf (stderr,
  259.                 "unknown string keyword %d (value \"%s\")\n",
  260.                              $1, $2);
  261.                         ParseError = 1;
  262.                       }
  263.                     }
  264.         ;
  265.  
  266. narg        : NKEYWORD number    { if (!do_number_keyword ($1, $2)) {
  267.                         twmrc_error_prefix();
  268.                         fprintf (stderr,
  269.                 "unknown numeric keyword %d (value %d)\n",
  270.                              $1, $2);
  271.                         ParseError = 1;
  272.                       }
  273.                     }
  274.         ;
  275.  
  276.  
  277.  
  278. full        : EQUALS keys COLON contexts COLON action  { $$ = $6; }
  279.         ;
  280.  
  281. fullkey        : EQUALS keys COLON contextkeys COLON action  { $$ = $6; }
  282.         ;
  283.  
  284. keys        : /* Empty */
  285.         | keys key
  286.         ;
  287.  
  288. key        : META            { mods |= Mod1Mask; }
  289.         | SHIFT            { mods |= ShiftMask; }
  290.         | LOCK            { mods |= LockMask; }
  291.         | CONTROL        { mods |= ControlMask; }
  292.         | META number        { if ($2 < 1 || $2 > 5) {
  293.                          twmrc_error_prefix();
  294.                          fprintf (stderr, 
  295.                 "bad modifier number (%d), must be 1-5\n",
  296.                               $2);
  297.                          ParseError = 1;
  298.                       } else {
  299.                          mods |= (Mod1Mask << ($2 - 1));
  300.                       }
  301.                     }
  302.         | OR            { }
  303.         ;
  304.  
  305. contexts    : /* Empty */
  306.         | contexts context
  307.         ;
  308.  
  309. context        : WINDOW        { cont |= C_WINDOW_BIT; }
  310.         | TITLE            { cont |= C_TITLE_BIT; }
  311.         | ICON            { cont |= C_ICON_BIT; }
  312.         | ROOT            { cont |= C_ROOT_BIT; }
  313.         | FRAME            { cont |= C_FRAME_BIT; }
  314.         | ICONMGR        { cont |= C_ICONMGR_BIT; }
  315.         | META            { cont |= C_ICONMGR_BIT; }
  316.         | ALL            { cont |= C_ALL_BITS; }
  317.         | OR            {  }
  318.         ;
  319.  
  320. contextkeys    : /* Empty */
  321.         | contextkeys contextkey
  322.         ;
  323.  
  324. contextkey    : WINDOW        { cont |= C_WINDOW_BIT; }
  325.         | TITLE            { cont |= C_TITLE_BIT; }
  326.         | ICON            { cont |= C_ICON_BIT; }
  327.         | ROOT            { cont |= C_ROOT_BIT; }
  328.         | FRAME            { cont |= C_FRAME_BIT; }
  329.         | ICONMGR        { cont |= C_ICONMGR_BIT; }
  330.         | META            { cont |= C_ICONMGR_BIT; }
  331.         | ALL            { cont |= C_ALL_BITS; }
  332.         | OR            { }
  333.         | string        { Name = $1; cont |= C_NAME_BIT; }
  334.         ;
  335.  
  336.  
  337. pixmap_list    : LB pixmap_entries RB
  338.         ;
  339.  
  340. pixmap_entries    : /* Empty */
  341.         | pixmap_entries pixmap_entry
  342.         ;
  343.  
  344. pixmap_entry    : TITLE_HILITE string { SetHighlightPixmap ($2); }
  345.         ;
  346.  
  347.  
  348. cursor_list    : LB cursor_entries RB
  349.         ;
  350.  
  351. cursor_entries    : /* Empty */
  352.         | cursor_entries cursor_entry
  353.         ;
  354.  
  355. cursor_entry    : FRAME string string {
  356.             NewBitmapCursor(&Scr->FrameCursor, $2, $3); }
  357.         | FRAME string    {
  358.             NewFontCursor(&Scr->FrameCursor, $2); }
  359.         | TITLE string string {
  360.             NewBitmapCursor(&Scr->TitleCursor, $2, $3); }
  361.         | TITLE string {
  362.             NewFontCursor(&Scr->TitleCursor, $2); }
  363.         | ICON string string {
  364.             NewBitmapCursor(&Scr->IconCursor, $2, $3); }
  365.         | ICON string {
  366.             NewFontCursor(&Scr->IconCursor, $2); }
  367.         | ICONMGR string string {
  368.             NewBitmapCursor(&Scr->IconMgrCursor, $2, $3); }
  369.         | ICONMGR string {
  370.             NewFontCursor(&Scr->IconMgrCursor, $2); }
  371.         | BUTTON string string {
  372.             NewBitmapCursor(&Scr->ButtonCursor, $2, $3); }
  373.         | BUTTON string {
  374.             NewFontCursor(&Scr->ButtonCursor, $2); }
  375.         | MOVE string string {
  376.             NewBitmapCursor(&Scr->MoveCursor, $2, $3); }
  377.         | MOVE string {
  378.             NewFontCursor(&Scr->MoveCursor, $2); }
  379.         | RESIZE string string {
  380.             NewBitmapCursor(&Scr->ResizeCursor, $2, $3); }
  381.         | RESIZE string {
  382.             NewFontCursor(&Scr->ResizeCursor, $2); }
  383.         | WAIT string string {
  384.             NewBitmapCursor(&Scr->WaitCursor, $2, $3); }
  385.         | WAIT string {
  386.             NewFontCursor(&Scr->WaitCursor, $2); }
  387.         | MENU string string {
  388.             NewBitmapCursor(&Scr->MenuCursor, $2, $3); }
  389.         | MENU string {
  390.             NewFontCursor(&Scr->MenuCursor, $2); }
  391.         | SELECT string string {
  392.             NewBitmapCursor(&Scr->SelectCursor, $2, $3); }
  393.         | SELECT string {
  394.             NewFontCursor(&Scr->SelectCursor, $2); }
  395.         | KILL string string {
  396.             NewBitmapCursor(&Scr->DestroyCursor, $2, $3); }
  397.         | KILL string {
  398.             NewFontCursor(&Scr->DestroyCursor, $2); }
  399.         ;
  400.  
  401. color_list    : LB color_entries RB
  402.         ;
  403.  
  404.  
  405. color_entries    : /* Empty */
  406.         | color_entries color_entry
  407.         ;
  408.  
  409. color_entry    : CLKEYWORD string    { if (!do_colorlist_keyword ($1, color,
  410.                                      $2)) {
  411.                         twmrc_error_prefix();
  412.                         fprintf (stderr,
  413.             "unhandled list color keyword %d (string \"%s\")\n",
  414.                              $1, $2);
  415.                         ParseError = 1;
  416.                       }
  417.                     }
  418.         | CLKEYWORD string    { list = do_colorlist_keyword($1,color,
  419.                                       $2);
  420.                       if (!list) {
  421.                         twmrc_error_prefix();
  422.                         fprintf (stderr,
  423.             "unhandled color list keyword %d (string \"%s\")\n",
  424.                              $1, $2);
  425.                         ParseError = 1;
  426.                       }
  427.                     }
  428.           win_color_list
  429.         | CKEYWORD string    { if (!do_color_keyword ($1, color,
  430.                                  $2)) {
  431.                         twmrc_error_prefix();
  432.                         fprintf (stderr,
  433.             "unhandled color keyword %d (string \"%s\")\n",
  434.                              $1, $2);
  435.                         ParseError = 1;
  436.                       }
  437.                     }
  438.         ;
  439.  
  440. save_color_list : LB s_color_entries RB 
  441.                 ;
  442.  
  443. s_color_entries : /* Empty */
  444.                 | s_color_entries s_color_entry 
  445.                 ;
  446.  
  447. s_color_entry   : string            { do_string_savecolor(color, $1); }
  448.                 | CLKEYWORD         { do_var_savecolor($1); }
  449.                 ;
  450.  
  451. win_color_list    : LB win_color_entries RB
  452.         ;
  453.  
  454. win_color_entries    : /* Empty */
  455.         | win_color_entries win_color_entry
  456.         ;
  457.  
  458. win_color_entry    : string string        { if (Scr->FirstTime &&
  459.                           color == Scr->Monochrome)
  460.                         AddToList(list, $1, $2); }
  461.         ;
  462.  
  463. squeeze        : SQUEEZE_TITLE { 
  464.                     if (HasShape) Scr->SqueezeTitle = TRUE;
  465.                 }
  466.         | SQUEEZE_TITLE { list = &Scr->SqueezeTitleL; 
  467.                   if (HasShape && Scr->SqueezeTitle == -1)
  468.                     Scr->SqueezeTitle = TRUE;
  469.                 }
  470.           LB win_sqz_entries RB
  471.         | DONT_SQUEEZE_TITLE { Scr->SqueezeTitle = FALSE; }
  472.         | DONT_SQUEEZE_TITLE { list = &Scr->DontSqueezeTitleL; }
  473.           win_list
  474.         ;
  475.  
  476. win_sqz_entries    : /* Empty */
  477.         | win_sqz_entries string JKEYWORD signed_number number    {
  478.                 if (Scr->FirstTime) {
  479.                    do_squeeze_entry (list, $2, $3, $4, $5);
  480.                 }
  481.             }
  482.         ;
  483.  
  484.  
  485. iconm_list    : LB iconm_entries RB
  486.         ;
  487.  
  488. iconm_entries    : /* Empty */
  489.         | iconm_entries iconm_entry
  490.         ;
  491.  
  492. iconm_entry    : string string number    { if (Scr->FirstTime)
  493.                         AddToList(list, $1, (char *)
  494.                         AllocateIconManager($1, NULLSTR,
  495.                             $2,$3));
  496.                     }
  497.         | string string string number
  498.                     { if (Scr->FirstTime)
  499.                         AddToList(list, $1, (char *)
  500.                         AllocateIconManager($1,$2,
  501.                         $3, $4));
  502.                     }
  503.         ;
  504.  
  505. win_list    : LB win_entries RB
  506.         ;
  507.  
  508. win_entries    : /* Empty */
  509.         | win_entries win_entry
  510.         ;
  511.  
  512. win_entry    : string        { if (Scr->FirstTime)
  513.                         AddToList(list, $1, 0);
  514.                     }
  515.         ;
  516.  
  517. icon_list    : LB icon_entries RB
  518.         ;
  519.  
  520. icon_entries    : /* Empty */
  521.         | icon_entries icon_entry
  522.         ;
  523.  
  524. icon_entry    : string string        { if (Scr->FirstTime) AddToList(list, $1, $2); }
  525.         ;
  526.  
  527. function    : LB function_entries RB
  528.         ;
  529.  
  530. function_entries: /* Empty */
  531.         | function_entries function_entry
  532.         ;
  533.  
  534. function_entry    : action        { AddToMenu(root, "", Action, NULLSTR, $1,
  535.                         NULLSTR, NULLSTR);
  536.                       Action = "";
  537.                     }
  538.         ;
  539.  
  540. menu        : LB menu_entries RB
  541.         ;
  542.  
  543. menu_entries    : /* Empty */
  544.         | menu_entries menu_entry
  545.         ;
  546.  
  547. menu_entry    : string action        { AddToMenu(root, $1, Action, pull, $2,
  548.                         NULLSTR, NULLSTR);
  549.                       Action = "";
  550.                       pull = NULL;
  551.                     }
  552.         | string LP string COLON string RP action {
  553.                       AddToMenu(root, $1, Action, pull, $7,
  554.                         $3, $5);
  555.                       Action = "";
  556.                       pull = NULL;
  557.                     }
  558.         ;
  559.  
  560. action        : FKEYWORD    { $$ = $1; }
  561.         | FSKEYWORD string {
  562.                 $$ = $1;
  563.                 Action = $2;
  564.                 switch ($1) {
  565.                   case F_MENU:
  566.                     pull = GetRoot ($2, NULLSTR,NULLSTR);
  567.                     pull->prev = root;
  568.                     break;
  569.                   case F_WARPRING:
  570.                     if (!CheckWarpRingArg (Action)) {
  571.                     twmrc_error_prefix();
  572.                     fprintf (stderr,
  573.             "ignoring invalid f.warptoring argument \"%s\"\n",
  574.                          Action);
  575.                     $$ = F_NOP;
  576.                     }
  577.                   case F_WARPTOSCREEN:
  578.                     if (!CheckWarpScreenArg (Action)) {
  579.                     twmrc_error_prefix();
  580.                     fprintf (stderr, 
  581.             "ignoring invalid f.warptoscreen argument \"%s\"\n", 
  582.                              Action);
  583.                     $$ = F_NOP;
  584.                     }
  585.                     break;
  586.                   case F_COLORMAP:
  587.                     if (CheckColormapArg (Action)) {
  588.                     $$ = F_COLORMAP;
  589.                     } else {
  590.                     twmrc_error_prefix();
  591.                     fprintf (stderr,
  592.             "ignoring invalid f.colormap argument \"%s\"\n", 
  593.                          Action);
  594.                     $$ = F_NOP;
  595.                     }
  596.                     break;
  597.                 } /* end switch */
  598.                    }
  599.         ;
  600.  
  601.  
  602. signed_number    : number        { $$ = $1; }
  603.         | PLUS number        { $$ = $2; }
  604.         | MINUS number        { $$ = -($2); }
  605.         ;
  606.  
  607. button        : BUTTON number        { $$ = $2;
  608.                       if ($2 == 0)
  609.                         yyerror("bad button 0");
  610.  
  611.                       if ($2 > MAX_BUTTONS)
  612.                       {
  613.                         $$ = 0;
  614.                         yyerror("button number too large");
  615.                       }
  616.                     }
  617.         ;
  618.  
  619. string        : STRING        { ptr = (char *)malloc(strlen($1)+1);
  620.                       strcpy(ptr, $1);
  621.                       RemoveDQuote(ptr);
  622.                       $$ = ptr;
  623.                     }
  624. number        : NUMBER        { $$ = $1; }
  625.         ;
  626.  
  627. %%
  628. yyerror(s) char *s;
  629. {
  630.     twmrc_error_prefix();
  631.     fprintf (stderr, "error in input file:  %s\n", s ? s : "");
  632.     ParseError = 1;
  633. }
  634. RemoveDQuote(str)
  635. char *str;
  636. {
  637.     register char *i, *o;
  638.     register n;
  639.     register count;
  640.  
  641.     for (i=str+1, o=str; *i && *i != '\"'; o++)
  642.     {
  643.     if (*i == '\\')
  644.     {
  645.         switch (*++i)
  646.         {
  647.         case 'n':
  648.         *o = '\n';
  649.         i++;
  650.         break;
  651.         case 'b':
  652.         *o = '\b';
  653.         i++;
  654.         break;
  655.         case 'r':
  656.         *o = '\r';
  657.         i++;
  658.         break;
  659.         case 't':
  660.         *o = '\t';
  661.         i++;
  662.         break;
  663.         case 'f':
  664.         *o = '\f';
  665.         i++;
  666.         break;
  667.         case '0':
  668.         if (*++i == 'x')
  669.             goto hex;
  670.         else
  671.             --i;
  672.         case '1': case '2': case '3':
  673.         case '4': case '5': case '6': case '7':
  674.         n = 0;
  675.         count = 0;
  676.         while (*i >= '0' && *i <= '7' && count < 3)
  677.         {
  678.             n = (n<<3) + (*i++ - '0');
  679.             count++;
  680.         }
  681.         *o = n;
  682.         break;
  683.         hex:
  684.         case 'x':
  685.         n = 0;
  686.         count = 0;
  687.         while (i++, count++ < 2)
  688.         {
  689.             if (*i >= '0' && *i <= '9')
  690.             n = (n<<4) + (*i - '0');
  691.             else if (*i >= 'a' && *i <= 'f')
  692.             n = (n<<4) + (*i - 'a') + 10;
  693.             else if (*i >= 'A' && *i <= 'F')
  694.             n = (n<<4) + (*i - 'A') + 10;
  695.             else
  696.             break;
  697.         }
  698.         *o = n;
  699.         break;
  700.         case '\n':
  701.         i++;    /* punt */
  702.         o--;    /* to account for o++ at end of loop */
  703.         break;
  704.         case '\"':
  705.         case '\'':
  706.         case '\\':
  707.         default:
  708.         *o = *i++;
  709.         break;
  710.         }
  711.     }
  712.     else
  713.         *o = *i++;
  714.     }
  715.     *o = '\0';
  716. }
  717.  
  718. static MenuRoot *GetRoot(name, fore, back)
  719. char *name;
  720. char *fore, *back;
  721. {
  722.     MenuRoot *tmp;
  723.  
  724.     tmp = FindMenuRoot(name);
  725.     if (tmp == NULL)
  726.     tmp = NewMenuRoot(name);
  727.  
  728.     if (fore)
  729.     {
  730.     int save;
  731.  
  732.     save = Scr->FirstTime;
  733.     Scr->FirstTime = TRUE;
  734.     GetColor(COLOR, &tmp->hi_fore, fore);
  735.     GetColor(COLOR, &tmp->hi_back, back);
  736.     Scr->FirstTime = save;
  737.     }
  738.  
  739.     return tmp;
  740. }
  741.  
  742. static void GotButton(butt, func)
  743. int butt, func;
  744. {
  745.     int i;
  746.  
  747.     for (i = 0; i < NUM_CONTEXTS; i++)
  748.     {
  749.     if ((cont & (1 << i)) == 0)
  750.         continue;
  751.  
  752.     Scr->Mouse[butt][i][mods].func = func;
  753.     if (func == F_MENU)
  754.     {
  755.         pull->prev = NULL;
  756.         Scr->Mouse[butt][i][mods].menu = pull;
  757.     }
  758.     else
  759.     {
  760.         root = GetRoot(TWM_ROOT, NULLSTR, NULLSTR);
  761.         Scr->Mouse[butt][i][mods].item = AddToMenu(root,"x",Action,
  762.             NULLSTR, func, NULLSTR, NULLSTR);
  763.     }
  764.     }
  765.     Action = "";
  766.     pull = NULL;
  767.     cont = 0;
  768.     mods_used |= mods;
  769.     mods = 0;
  770. }
  771.  
  772. static void GotKey(key, func)
  773. char *key;
  774. int func;
  775. {
  776.     int i;
  777.  
  778.     for (i = 0; i < NUM_CONTEXTS; i++)
  779.     {
  780.     if ((cont & (1 << i)) == 0) 
  781.       continue;
  782.     if (!AddFuncKey(key, i, mods, func, Name, Action)) 
  783.       break;
  784.     }
  785.  
  786.     Action = "";
  787.     pull = NULL;
  788.     cont = 0;
  789.     mods_used |= mods;
  790.     mods = 0;
  791. }
  792.  
  793.  
  794. static void GotTitleButton (bitmapname, func, rightside)
  795.     char *bitmapname;
  796.     int func;
  797.     Bool rightside;
  798. {
  799.     if (!CreateTitleButton (bitmapname, func, Action, pull, rightside, True)) {
  800.     twmrc_error_prefix();
  801.     fprintf (stderr, 
  802.          "unable to create %s titlebutton \"%s\"\n",
  803.          rightside ? "right" : "left", bitmapname);
  804.     }
  805.     Action = "";
  806.     pull = NULL;
  807. }
  808.  
  809. static Bool CheckWarpScreenArg (s)
  810.     register char *s;
  811. {
  812.     XmuCopyISOLatin1Lowered (s, s);
  813.  
  814.     if (strcmp (s,  WARPSCREEN_NEXT) == 0 ||
  815.     strcmp (s,  WARPSCREEN_PREV) == 0 ||
  816.     strcmp (s,  WARPSCREEN_BACK) == 0)
  817.       return True;
  818.  
  819.     for (; *s && isascii(*s) && isdigit(*s); s++) ; /* SUPPRESS 530 */
  820.     return (*s ? False : True);
  821. }
  822.  
  823.  
  824. static Bool CheckWarpRingArg (s)
  825.     register char *s;
  826. {
  827.     XmuCopyISOLatin1Lowered (s, s);
  828.  
  829.     if (strcmp (s,  WARPSCREEN_NEXT) == 0 ||
  830.     strcmp (s,  WARPSCREEN_PREV) == 0)
  831.       return True;
  832.  
  833.     return False;
  834. }
  835.  
  836.  
  837. static Bool CheckColormapArg (s)
  838.     register char *s;
  839. {
  840.     XmuCopyISOLatin1Lowered (s, s);
  841.  
  842.     if (strcmp (s, COLORMAP_NEXT) == 0 ||
  843.     strcmp (s, COLORMAP_PREV) == 0 ||
  844.     strcmp (s, COLORMAP_DEFAULT) == 0)
  845.       return True;
  846.  
  847.     return False;
  848. }
  849.  
  850.  
  851. twmrc_error_prefix ()
  852. {
  853.     fprintf (stderr, "%s:  line %d:  ", ProgramName, yylineno);
  854. }
  855.